﻿// 1004train01.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>
#include <numeric>
#include <iomanip>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <deque>
#include <bitset>

using namespace std;

int generatePalindrome(int left)
{
    int palin = left;
    left = left / 10;
    while (left!=0)
    {
        palin = palin * 10 + left % 10;
        left = left / 10;
    }
    return palin;
}


/*
给你一个字符串s，字符串s首尾相连成一个环形
请你在环中找出"l"、"o"、"x" 字符都恰好出现了偶数次最长子字符串的长度

输入描述
输入是一串小写的字母组成的字符串。

输出描述
输出是一个整数

输入
alolobo
输出
6
 */
class Solution01
{
public:
    Solution01(string&origin_str)
    {
        int origin_size = origin_str.size();
        int ring_size = 2 * origin_size;
        string ring_str;
        for (int i=0; i<ring_size; i++)
        {
            ring_str += origin_str[i % origin_size];
        }

        //前缀和数组，xor翻转奇偶
        vector<int>pre_sum(ring_size+1);
        for (int i=1; i<=ring_size; i++)
        {
            char curr = ring_str[i-1];
            if (char_map.count(curr)>0)
            {
                pre_sum[i] = pre_sum[i - 1] ^ char_map[curr];
            }
            else
            {
                pre_sum[i] = pre_sum[i - 1];
            }
        }

        int max_length = 1;

        for (int d=origin_size; d>1; d--)
        {
            for (int start=0; start<=origin_size; start++)
            {
                int end = start + d;
                if (pre_sum[start] == pre_sum[end] && d > max_length)
                    max_length = d;
            }
        }

        cout << max_length;
	    //Solution01
    }
private:
    //"l"、"o"、"x"
    unordered_map<char, int>char_map = {
		{'l',4},{'o',2},{'x',1}
    };
};

string minWindow(string S, string T) {
    // write code here
    //初始化子串
    int target_count = T.size();
    vector<int>char_vec(128);
    for (auto& ch : T)
    {
        char_vec[ch] += 1;
    }

    int min_length = INT_MAX;
    int pos = -1;
    int left = 0;
    int str_size = S.size();
    for (int right = 0; right < str_size; right++)
    {
        char curr = S[right];
        if (char_vec[curr] > 0)
        {
            //找到目标字符
            target_count--;
        }
        char_vec[curr]--;

        while (target_count == 0)
        {
            //收缩左窗
            if (right - left + 1 < min_length)
            {
                pos = left;
                min_length = right - left + 1;
            }

            char left_ch = S[left];
            if (char_vec[left_ch] == 0)
            {
                target_count++;
            }
            char_vec[left_ch]++;
            left++;
            //while---
        }


        //for---
    }
    return S.substr(pos, min_length);

}

int maxProfit(vector<int>& prices) {
    // write code here
    vector<int>status(2);
    vector<vector<int>>limit(2, status);
    int v_size = prices.size();
    vector<vector<vector<int>>>dynamic_v(v_size, limit);

    int sum = accumulate(prices.begin(), prices.end(), 0);
    dynamic_v[0][1][0] = 0;
    dynamic_v[0][0][1] = -prices[0];

    for (int i = 1; i < v_size; i++)
    {
        //dp[i][k][0]=max(dp[i][k][0], dp[i][k][1]+prices[0])
        //dp[i][k][1]=max(dp[i][k][1], dp[i][k-1][1]-prices[0])
    }

    return dynamic_v[v_size - 1][1][0];
    //---
}

int main()
{
	{
        //"XDOYEZODEYXNZ","XYZ"
        //"YXNZ"
        string S = "XDOYEZODEYXNZ", T = "XYZ";
        cout << minWindow(S, T);

        return 0;
	}
	{
        string binary_str = "110";
        bitset<32>bs(binary_str);
        uint64_t num = bs.to_ulong();

        string str = bitset<32>(num).to_string();
        //cout << str;

        cout << fixed << setprecision(1) << num;

        return 0;
	}
	{
        string origin_str;
        getline(cin, origin_str);

        Solution01 solu(origin_str);

        return 0;
	}
    int num = 100;
    cout << generatePalindrome(num);

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
